#include <string.h>
#include <stdlib.h>
#include "transporterLoad.h"
typedef int bool;
#define true 1
#define false 0


int loadTransporters(char const *filename){
	FILE *ptr_file;
	ptr_file=fopen(filename,"r");
	if(!ptr_file){
		return 1;
	}
	int maxlinelen;
	int numlines=getFileInfo(ptr_file,&maxlinelen);
	transportercount=numlines;
	transporterdata=(struct TransporterVars*) calloc(numlines,sizeof(struct TransporterVars));
	char *buf=(char*) malloc(maxlinelen*sizeof(char));
	for(int i=0;i<numlines;i++){
		fgets(buf,maxlinelen,ptr_file);//load line into buffer;
		sscanf(strtok(buf,"/"), "%d", &transporterdata[i].id);
		strcpy(transporterdata[i].email,strtok(NULL,"/"));
		strcpy(transporterdata[i].password,strtok(NULL,"/"));
		strcpy(transporterdata[i].company,strtok(NULL,"/"));
		strcpy(transporterdata[i].town,strtok(NULL,"\n"));
	}
	fclose(ptr_file);
	return 0;
}

int writeTransporters(char const *filename){
	FILE *ptr_file;
	ptr_file=fopen(filename,"w");
	if(!ptr_file){
		return 1;
	}
	for(int i=0;i<transportercount;i++){
		fprintf(ptr_file,"%d/%s/%s/%s/%s\n",transporterdata[i].id,transporterdata[i].email,transporterdata[i].password,transporterdata[i].company,transporterdata[i].town);
	}
	fclose(ptr_file);
	free(transporterdata);
	return 0;
}

void addTransporter(struct TransporterVars n){
	transporterdata=(struct TransporterVars*) realloc(transporterdata,++transportercount*sizeof(struct TransporterVars));
	transporterdata[transportercount-1]=n;
}

void rmTransporter(int index){
	for(int i=index;i<transportercount-1;i++){
		transporterdata[i]=transporterdata[i+1];
	}
	transporterdata=(struct TransporterVars*) realloc(transporterdata,--transportercount*sizeof(struct TransporterVars));
}


void profileMenu(int index){
	int option;
	system("clear");
	printf("\n*****¿QUÉ DESEAS REALIZAR?*****\n");
	printf("\n1. Consultar tus datos.\n2. Modificar tu perfil.\n");
	fflush(stdin);
	scanf("%d", &option);

	while(option<1 && option>2){ //if the option is an invalid number
		system("clear");
		printf("El número introducido no es válido.\n");
		printf("\n*****¿QUÉ DESEAS REALIZAR?*****\n");
		printf("\n1. Consultar tus datos.\n2. Modificar tu perfil.\n");
		fflush(stdin);
		scanf("%d", &option);
	}

		switch (option)
		{
		case 1: //consult the profile
			system("clear");
			printf("\n***TUS DATOS SON:***\n");
			consultTransporterData(index);
		break;
			
		case 2: //modify the profile
			modifyTransporterData(index);
		break;
		}

}

void consultTransporterData(int index){
	printf("\nIdentificador de transportista: %d\nEmail: %s\nContraseña: %s\nNombre de la empresa: %s\nCiudad de reparto: %s", transporterdata[index].id,transporterdata[index].email,transporterdata[index].password,transporterdata[index].company,transporterdata[index].town);
}

void modifyTransporterData(int index){
	int option;
	printf("\n¿Qué desea modificar?");
	printf("\n1. Identificador de transportista\n2. Email\n3. Contraseña\n4. Nombre de la empresa\n5. Ciudad de reparto\n");
	scanf("%d", &option);

	while(option<1 && option>5){
		system("clear");
		printf("\nEl número introducido no es válido");
		printf("\n¿Qué desea modificar?");
		printf("\n1. Identificador de transportista\n2. Email\n3. Contraseña\n4. Nombre de la empresa\n5. Ciudad de reparto\n");
		scanf("%d", &option);
	}

	switch(option){
		case 1: //changes the id
		system("clear");
		modifyTransporterID(index);
		break;

		case 2: //changes the email
		system("clear");
		modifyTransporterEmail(index);
		break;

		case 3: //changes the password
		system("clear");
		modifyTransporterPassword(index);
		break;

		case 4: //changes the company
		system("clear");
		modifyTransporterCompany(index);
		break;

		case 5: //changes the town
		system("clear");
		modifyTransporterTown(index);
		break;
	}

}


void modifyTransporterID(int index){
	int id;
	bool bool = false; 
	printf("\nTu antiguo id era %d", transporterdata[index].id);
	printf("\nIntroduce el nuevo id: ");
	scanf("%d", &id);

	do{
		bool = true;
		for(int i=0; i<transportercount; i++){
			if (transporterdata[i].id == id){ //if the new id already exits
				printf("\nEl id introducido ya existe, por favor introduzca otro: ");
				scanf("%d", &id);
				bool = false;
			}
		}

	}while(bool == false);

	printf("\nTu nuevo id es: %d", id);
	transporterdata[index].id=id; 
}

void modifyTransporterEmail(int index){
	char email[30];
	bool bool = false; 
	printf("\nTu antiguo email era %s", transporterdata[index].email);
	fflush(stdin);
	printf("\nIntroduce el nuevo email: ");
	gets(email);

	do{
		fflush(stdin);
		bool = true;
		for(int i=0; i<transportercount; i++){ 
			if (strcmp(transporterdata[i].email,email)==0){ //if the new email already exits
				fflush(stdin);
				printf("\nEl email introducido ya está resgistrado, por favor introduzca otro: ");
				gets(email);
				bool = false;
			}
		}

	}while(bool == false);

	printf("\nTu nuevo email es: %s", email);
	strcpy(transporterdata[index].email, email);

}

void modifyTransporterPassword(int index){
	char password[30];
	printf("\nTu antigua contraseña era %s", transporterdata[index].password);
	fflush(stdin);
	printf("\nIntroduce la nueva contraseña: ");
	gets(password);

	printf("\nTu nueva contraseña es: %s", password);
	strcpy(transporterdata[index].password, password);

}

void modifyTransporterCompany(int index){
	char company[30];
	printf("\nTu antigua compañía era %s", transporterdata[index].company);
	fflush(stdin);
	printf("\nIntroduce la nueva empresa: ");
	gets(company);

	printf("\nTu nueva compañía es: %s", company);
	strcpy(transporterdata[index].company, company);
}


void modifyTransporterTown(int index){
	char town[20];
	printf("\nTu antigua ciudad de reparto era %s", transporterdata[index].town);
	fflush(stdin);
	printf("\nIntroduce la ciudad de reparto: ");
	gets(town);

	printf("\nTu nueva ciudad de reparto es: %s", town);
	strcpy(transporterdata[index].town, town);
}
